package com.vzoom.logdesensitization.config;

import org.springframework.beans.factory.SmartInitializingSingleton;
import org.springframework.boot.context.properties.ConfigurationProperties;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@ConfigurationProperties(prefix = "log-desensitization")
public class DesensitizationConfig implements SmartInitializingSingleton {
    /**
     * 是否开启脱敏,默认开启,关闭的话需要配置false
     */
    private Boolean enable = Boolean.TRUE;

    /**
     * 自定义的脱敏策略配置,需要注册成为spring的bean,已经内置了一些脱敏策略,可以直接使用<br/>
     * 自己添加的策略如果和原有的策略名字重复,那么自己添加的策略将会起效,覆盖原来的策略
     * 如果@nsrsbh,那么key就是nsrsbh,实现就是nsrsbhDesensitizationStrategy,是spring的beanName
     */
    private Map<String, String> strategyRegister = new HashMap<>();

    /**
     * json对象脱敏策略的配置,map结构,策略名字对应属性名字列表,逗号分割即可
     */
    private Map<String, List<String>> json = new HashMap<>();

    /**
     * json字符串脱敏策略的配置,map结构,策略名字对应属性名字列表,逗号分割即可
     */
    private Map<String, List<String>> jsonStr = new HashMap<>();

    /**
     * xml字符串脱敏策略的配置,map结构,策略名字对应属性名字列表,逗号分割即可
     */
    private Map<String, List<String>> xmlStr = new HashMap<>();

    /**
     * 数据库字段脱敏,map结构,策略名字对应属性名字列表,逗号分割即可,属性名字配置和使用不区分大小写<br/>
     * 注意,属性名字分为以下几种情况,分别是mapper的名字<br/>
     * 1. 没有@Param的默认是形参名字<br/>
     * 2. 有@Param的就是@Param的value<br/>
     * 3. mybatis plus的对应是属性的数据库字段名字和java字段名字,两者都需要<br/>
     * 4. 形参是map的对应的是key的名字<br/>
     * <p>
     * 最佳实践,如果是使用mybatis,配置1 2 4,即可,如果是使用mybatis plus,一般需要配置1 2 3<br/>
     * 保险起见,配置脱敏字段的属性名和数据库名字即可,成套配置,比如同时配置nick_name和nickName,id_和id,还要注意形参和param的名字<br/>
     */
    private Map<String, List<String>> sqlParameter = new HashMap<>();

    public Boolean getEnable() {
        return enable;
    }

    public void setEnable(Boolean enable) {
        this.enable = enable;
    }

    public Map<String, String> getStrategyRegister() {
        return strategyRegister;
    }

    public void setStrategyRegister(Map<String, String> strategyRegister) {
        this.strategyRegister = strategyRegister;
    }

    public Map<String, List<String>> getJson() {
        return json;
    }

    public void setJson(Map<String, List<String>> json) {
        this.json = json;
    }

    public Map<String, List<String>> getJsonStr() {
        return jsonStr;
    }

    public void setJsonStr(Map<String, List<String>> jsonStr) {
        this.jsonStr = jsonStr;
    }

    public Map<String, List<String>> getXmlStr() {
        return xmlStr;
    }

    public void setXmlStr(Map<String, List<String>> xmlStr) {
        this.xmlStr = xmlStr;
    }

    public Map<String, List<String>> getSqlParameter() {
        return sqlParameter;
    }

    public void setSqlParameter(Map<String, List<String>> sqlParameter) {
        this.sqlParameter = sqlParameter;
    }

    private static DesensitizationConfig desensitizationConfig;

    @Override
    public void afterSingletonsInstantiated() {
        desensitizationConfig = this;
    }

    public static DesensitizationConfig getDesensitizationConfig() {
        return desensitizationConfig;
    }
}
